package top.guoziyang.mydb.backend.dm;

import top.guoziyang.mydb.backend.dm.dataItem.DataItem;
import top.guoziyang.mydb.backend.dm.logger.Logger;
import top.guoziyang.mydb.backend.dm.page.PageOne;
import top.guoziyang.mydb.backend.dm.pageCache.PageCache;
import top.guoziyang.mydb.backend.tm.TransactionManager;

public interface DataManager {
    DataItem read(long uid) throws Exception;
    long insert(long xid, byte[] data) throws Exception;
    void close();

    /**
     * 创建一个新的DataManager实例
     */
    public static DataManager create(String path, long mem, TransactionManager tm) {
        // 创建PageCache实例，用于数据页服务管理
        PageCache pc = PageCache.create(path, mem);
        // 创建Logger实例，用于管理日志记录
        Logger lg = Logger.create(path);
        // 实例化DataManagerImpl，将PageCache、Logger和事务管理器建立
        DataManagerImpl dm = new DataManagerImpl(pc, lg, tm);
        // 初始化第一页，存储数据库的元数据
        dm.initPageOne();
        return dm;
    }


    /**
     * 打开现有的DataManager实例
     */
    public static DataManager open(String path, long mem, TransactionManager tm) {
        PageCache pc = PageCache.open(path, mem);
        Logger lg = Logger.open(path);
        DataManagerImpl dm = new DataManagerImpl(pc, lg, tm);
        // 第一页不完整或存在损坏,通过Recover.recover执行恢复操作
        if(!dm.loadCheckPageOne()) {
            Recover.recover(tm, lg, pc);
        }
        // 初始化pageIndex
        dm.fillPageIndex();
        // 将第一页的校验码设置为“打开”状态，表示数据库已成功加载
        PageOne.setVcOpen(dm.pageOne);
        // 将第一页面数据刷新到磁盘中，以保证页面的内容持久化
        dm.pc.flushPage(dm.pageOne);

        return dm;
    }
}
